package com.FundamentalDemos.Array;

import java.util.Arrays;
import java.util.Scanner;

public class 学会使用数组 {
    public static void main(String[] args) {

        //静态初始化数组
        //数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3,...}

        //完整格式
        String[] array2 = new String[]{"China", "India", "Japan"};
        double[] array3 = new double[]{1.1, 2.2, 3.3, 4.4, 5.5, 6, 7};
        //简化格式
        int[] array1 = {1, 2, 3, 4, 5};
        //int[] array1  等价于 int array1[]
        //建议[]放在类型后,同一类型的数组只能放同种类型的元素
        char[] array4 = {};//空元素数组

        System.out.println("打印array1的值:" + array1);
        //打印array1的值:[I@1a407d53
        //[:代表数组
        //I:代表int类型的
        //@:代表在某个地址,后面是十六进制的地址
        System.out.println("打印array2的值:" + array2);
        System.out.println("打印array3的值:" + array3);
        //数组名中存的是数组起始元素的地址,因此数组是一种引用类型

        System.out.println("------------");


        //遍历数组求和
        int[] money = {16, 26, 36, 6, 100};
        int sum = 0;
        for (int i = 0; i < money.length; i++) {
            sum += money[i];
        }
        System.out.println("sum = " + sum);
        System.out.println("------------");


        //访问数组元素: 数组名[索引/下标]
        //数组名.length 为数组长度
        int t = 0;
        Scanner sc = new Scanner(System.in);
        t = sc.nextInt();
        int[] a = new int[t];//称为动态初始化数组,Java数组是可以用变量作为下标来初始化数组,数组未赋初值时会有初值
        // int[] arr = new int[3]{1,2,3};//没有这种写法,非法!

        /*
         * 动态初始化数组元素默认值规则:
         * 基本类型中:
         * byte,short,char,int,long 为 0
         * float,double 为 0.0
         * boolean 为 false
         * 引用类型中:
         * 类,接口,数组,String 为 null
         * */

        for (int i = 0; i < a.length; i++) {
            System.out.println("a[" + i + "]初值为" + a[i]);
        }

        char[] chArr = new char[3];
        System.out.println("char[3]的默认值如下:");
        System.out.println((int) chArr[0]);
        System.out.println((int) chArr[1]);
        System.out.println((int) chArr[2]);

        boolean[] b = new boolean[1];
        System.out.println("boolean[1]的默认值如下:");
        System.out.println(b[0]);

        double[] d = new double[3];
        System.out.println("double[3]的默认值如下:");
        System.out.println(d[0]);
        System.out.println(d[1]);
        System.out.println(d[2]);
        String[] str = new String[3];
        System.out.println("String[3]的默认值如下:");
        System.out.println(str[0]);
        System.out.println(str[1]);
        System.out.println(str[2]);


        System.out.println("------------");


        //静态初始化居然可以使用变量!!!
        int aa = sc.nextInt();
        int bb = sc.nextInt();
        int cc = sc.nextInt();
        int[] arr = new int[]{aa, bb, cc};
        for (int i = 0; i < arr.length; i++) {
            System.out.println("arr[" + i + "]=" + arr[i]);
        }


        System.out.println("------------");
        //动态创建数组时不赋初值,之后再通过循环赋值
        for (int i = 0; i < a.length; i++) {//遍历数组
            a[i] = i + 1;
        }
        //可以使用 数组名.fori 快速创建数组遍历
        for (int i = 0; i < a.length; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();

        //也可以直接开辟一块新的空间,也即new一个新的数组,赋值给原数组名,原空间丢失引用,被系统回收
        a = new int[]{1, 2, 3};
        a = new int[]{aa, bb, cc};
        a = new int[5];


        System.out.println("------------");

        arr = new int[]{1, 2, 3, 4, 5};
        String[] arr1 = new String[]{"China", "India", "America", "Japan", "Russia"};
        System.out.println(Arrays.toString(arr));
        System.out.println(Arrays.toString(arr1));//调用工具类Arrays中的toString()方法快速把数组值转成字符串s
        /*
         * [1, 2, 3, 4, 5]
         * [China, India, America, Japan, Russia]
         * */

    }
}
